<?php

namespace App\Services;

/**
* Api 处理类
*/
class ApiService
{
    /**
     * 接口调用成功状态码，子类可根据实际情况进行覆盖
     */
    const SUCCESS = 0;

    /**
     * 默认的 CURL 设置
     */
    protected $curlopt = [
        // 返回页面内容
        CURLOPT_RETURNTRANSFER  => TRUE,
        // 处理所有编码
        CURLOPT_ENCODING        => "",
        // 
        CURLOPT_USERAGENT       => "spider",
        // 自定重定向
        CURLOPT_AUTOREFERER     => TRUE,
        // 链接超时时间
        CURLOPT_CONNECTTIMEOUT  => 15,
        // 超时时间
        CURLOPT_TIMEOUT         => 20,
        // 超过十次重定向后停止
        CURLOPT_MAXREDIRS       => 10,
        // 不检查ssl链接
        CURLOPT_SSL_VERIFYHOST  => 0,
        // 
        CURLOPT_SSL_VERIFYPEER  => FALSE,
        // 
        CURLOPT_VERBOSE         => 1,
    ];

    /**
     * 设置 curl 参数
     */
    public function setOpt( $opt )
    {
        if ( !empty( $opt ) && is_array( $opt ) )
        {
            $this->curlopt = $this->curlopt + $opt;
        }
    }

    /**
     * 获取 curl 参数
     */
    public function getOpt()
    {
        return $this->curlopt;
    }

    /**
     * 根据参数数组创建 url
     * @param string $url 原 url 地址
     * @param arrar $params 需要添加到 url 的参数数组
     * @return string 创建成功的新 url
     */
    public static function buildUrl( $url, $params = [] )
    {
        if ( empty( $params ) )
            return $url;
        $params = http_build_query( $params );
        return $url . ( ( strpos($url, '?') ) ? '&' : '?' ) . $params;
    }

    /**
     * 调用 Api 并返回结果
     * @param string $url Api 接口的地址
     * @param string $post 需要 post 的参数数组，一般为 JSON 格式
     * @return mixed | boolen 调用成功返回相应内容，失败返回 FALSE
     */
    public function accessUrl( $url, $post = [] )
    {
        $opt = $this->curlopt;
        if ( !empty( $post ) )
        {
            $opt = $opt + [
                CURLOPT_POST        => 1,
                CURLOPT_POSTFIELDS  => $post,
            ];
        }
        $curl = curl_init( $url );
        curl_setopt_array( $curl, $opt );
        $result = curl_exec( $curl );
        if ( $result === FALSE )
        {
            // 暂时不知道怎么封装 curl 请求失败的情况
            // $curl_errno = curl_errno( $curl );
            // $curl_error = curl_error( $curl );
            $result = FALSE;
        }
        return $result;
    }
}